// 导入工具类
let utilsObj = require('./module/common/utils.js');

// 点击立即开始
threads.start(function() {
    while (true) {
        let click1 = text("立即开始").findOne(100)
        if (click1) {
            click1.click()
        }
        let click2 = text("关闭应用").findOne(100)
        if (click2) {
            click2.click()
        }
    }
});
sleep(1000)
try {
    images.stopScreenCapture()
    images.requestScreenCapture({
        orientation: utilsObj.getOrientation()
    })
} catch (error) {
    if (commonStorage.get('debugModel')) {
        console.error("主程序请求截图错误", error)
    }
}

// 启动应用方法
let startAppFun = () => {

    let launchAppBy微信 = () => {
        launchApp("微信");
        let 微信双开第一项 = id("com.miui.securitycore:id/app2").findOne(1000);
        if (微信双开第一项) {
            微信双开第一项.click();
        }
        sleep(500)
    }

    // 通过搜索启动游戏
    let startAppFunBySearch = () => {
        // 启动微信
        launchAppBy微信();

        let 微信搜索 = id("com.tencent.mm:id/gsl").desc("搜索").className("android.widget.RelativeLayout").findOne(1000);
        if (微信搜索) {
            微信搜索.click();
        }

        let 搜索小程序 = text("小程序").className("android.widget.Button").findOne(2000);
        if (搜索小程序) {
            搜索小程序.click();
        }
        sleep(500);
        setText("咸鱼之王");
        let 搜索按钮 = id("com.tencent.mm:id/m6r").text("搜索").className("android.widget.TextView").findOne(1000);
        if (搜索按钮) {
            搜索按钮.click();
        }
        let 小程序 = textStartsWith("咸鱼之王").className("android.widget.Button").findOne(1000);
        if (小程序) {
            小程序.click();
        }
    }

    // 通下拉启动
    let startAppFunByDownPull = () => {
        // 启动微信
        launchAppBy微信();

        let position1 = utilsObj.convertXY(531, 454);
        let position2 = utilsObj.convertXY(521, 1228);
        // 下拉滑动
        swipe(position1.x, position1.y, position2.x, position2.y, 200);

        sleep(800);
        // 全屏找色 获取咸鱼之王图标点
        let img = captureScreen();
        let result = utilsObj.regionalFindMultipleColor2(img, 0, 0, device.width, device.height, 60, 255, "#5C2925", [
            [-8, 3, "#F1F30C"],
            [-14, -13, "#C1CDAF"],
            [2, -36, "#FFFCAD"],
            [-45, -42, "#7E4A30"],
            [-55, 33, "#EFC86A"],
            [1, 31, "#46C99F"],
            [29, 27, "#602D27"],
            [39, 31, "#F2BE56"],
            [1, 58, "#5B6F7B"],
            [-6, 67, "#26253A"],
            [-15, -76, "#242338"],
            [-82, 5, "#242337"],
            [64, 4, "#27263B"]
        ], 26, false, false, "找咸鱼之王图标");
        utilsObj.recycleNull(img);
        console.log("找色结果", result)
        if (result && result.x !== -1) {
            // 点击咸鱼之王启动
            utilsObj.randomClick(result.x, result.y, 1, false);
        }
    }

    // 检测已启动
    let checkAlreadyStart = () => {
        let 更多按钮 = id("com.tencent.mm:id/fd").desc("更多").className("android.widget.ImageButton").findOne(100);
        let 关闭按钮 = id("com.tencent.mm:id/fc").desc("关闭").className("android.widget.ImageButton").findOne(100);
        if (更多按钮 && 关闭按钮) {
            return true;
        }
        return false;
    }

    // 未启动
    if (!checkAlreadyStart()) {
        // 执行下拉方法进行启动
        startAppFunByDownPull();
        sleep(1000)

        // 再次检测没有启动
        if (!checkAlreadyStart()) {
            // 尝试通过搜索方式启动
            startAppFunBySearch();
        }

    }
}

// 重启应用方法
let reStartAppFun = () => {
    // 如果当前已启动
    if (checkAlreadyStart()) {
        // 通过控件点击重启
        let 重新进入 = id("com.tencent.mm:id/knx").textStartsWith("重新进入").className("android.widget.TextView").findOne(500);
        if (重新进入) {
            let parent = 重新进入.parent();
            if (parent) {
                parent.click();
            }
        }
    } else {
        // 如果没有启动 执行启动方法
        startAppFun()
    }
}


// 启动  app的名称
startAppFun()
// 注册控制台显示事件
events.broadcast.on("mainShowLog", () => {
    console.setSize(device.width / 2, device.height / 3);
    console.setPosition(device.width / 2, device.height * 2 / 3)
    console.show()
});
events.broadcast.on("mainHideLog", () => {
    console.hide()
});

events.on("exit", function() {
    // 更新状态栏内容
    events.broadcast.emit("updateMessageFloaty", 'messageText', '点击按钮开始');
    console.log("停止主程序脚本,结束运行");
    $debug.gc()
    utilsObj.clearMemory()
});


// 无匹配次数
let notMatchingCount = 0
// 连续同一个页面次数
let samePageCount = 0;

// 导入业务常量类
let serviceConstant = require('./module/common/serviceConstant.js')

let config = require('./module/common/config.js')

let commonStorage = storages.create("zjh336.cn" + config.commonScriptKey);

let 文字识别插件 = commonStorage.get("文字识别插件") || "谷歌"
utilsObj.initOcr(文字识别插件)

// 本地储存对象
var serviceStorage = storages.create("zjh336.cn" + config.serviceScriptKey);

// 当前页面
let curPage = ""


// 刷新截图权限
events.broadcast.on("refreshScreenCapture", () => {
    console.log("主程序接收指令,刷新截图权限")
    try {
        images.stopScreenCapture()
        images.requestScreenCapture({
            orientation: utilsObj.getOrientation()
        })
        sleep(500)
    } catch (error) {
        console.error("刷新截图权限错误", error)
    }
});


// 获取当前页面
function getCurPage() {
    // 截全屏
    let allScreenImg = captureScreen();
    let select业务 = commonStorage.get("select业务")
    // 多条件匹配
    let curPage = utilsObj.multipleConditionMatchingByServiceName(select业务, allScreenImg);
    return curPage;
}



/**
 * //区域找图或者区域特征匹配
 * utilsObj.regionalFindImgOrFeatures
 * // 模板匹配或特征模板匹配
 * utilsObj.regionalMatchTemplateOrMatchFeatures
 * 测试代码：
  sleep(1000)  
  let img = captureScreen()
  let targetImg = images.read('./res/1080_1920/主页_设置图标.png')
  let result = utilsObj.regionalMatchTemplateOrMatchFeatures(img,targetImg,0,0,1920,1080,60,255,0.8,2,false,1,1,0.8,false,false,"测试代码")
  if(result){
    result.sortBy("left")
    toastLog(JSON.stringify(result.matches))
  }
  utilsObj.recycleNull(img);
  utilsObj.recycleNull(targetImg);
  toastLog(result);
 */


// 操作处理方法
function operateHandle(page) {
    let handlerFun = this["operate_" + page]
    if (handlerFun) {
        handlerFun()
    } else {
        console.warn("【" + page + "】未找到处理方法")
    }
}


function operate_游戏首页() {
    utilsObj.executeServiceOperate("游戏首页", "首页找图点击未展开任务列表", "regionalClickImg2", () => {
        sleep(1000)
        utilsObj.executeServiceOperate("游戏首页", "首页识字点击任务文字", "regionalClickText2", () => {});
    })
}


function operate_任务页() {
    // let serviceStorage = commonStorage;
    while (true) {
        let 领取坐标 = utilsObj.executeServiceOperate("任务页", "文字识别获取领取坐标", "regionalAnalysisChartPosition2", () => {})
        if (领取坐标) {
            utilsObj.randomClick(领取坐标.x, 领取坐标.y, 1, false)
        } else {
            break;
        }
        sleep(500)
    }

    let 活跃周奖励arr = ["100", "200", "300", "400", "500"]
    let 活跃日奖励arr = ["20", "40", "60", "80", "100"]


    // 检测是否存在可领取奖励
    let 周活跃奖励坐标 = utilsObj.executeServiceOperate("任务页", "周活跃奖励区域", "regionalFindMultipleColor2", () => {})
    if (周活跃奖励坐标 && 周活跃奖励坐标.x !== -1) {

        let 周活跃奖励文字ObjArr = utilsObj.executeServiceOperate("任务页", "周活跃奖励区域", "regionalAnalysisChart3", () => {})
        for (let i = 0; i < 周活跃奖励文字ObjArr.length; i++) {
            let obj = 周活跃奖励文字ObjArr[i];
            // 包含周活跃数值
            if (活跃周奖励arr.includes(obj.text)) {
                // 点击奖励
                utilsObj.randomClick(Number(obj.x), Number(obj.y) - 100, 1, false)

                sleep(600)

                utilsObj.executeServiceOperate("任务页", "识字点击返回主界面", "regionalClickText2", () => {})

                sleep(500)
                周活跃奖励坐标 = utilsObj.executeServiceOperate("任务页", "周活跃奖励区域", "regionalFindMultipleColor2", () => {})

                if (周活跃奖励坐标 && 周活跃奖励坐标.x === -1) {
                    break;
                }
            }
        }
    }

    // 检测是否存在可领取奖励
    let 日活跃奖励坐标 = utilsObj.executeServiceOperate("任务页", "日活跃奖励区域", "regionalFindMultipleColor2", () => {})
    if (日活跃奖励坐标 && 日活跃奖励坐标.x !== -1) {

        let 日活跃奖励文字ObjArr = utilsObj.executeServiceOperate("任务页", "日活跃奖励区域", "regionalAnalysisChart3", () => {})
        for (let i = 0; i < 日活跃奖励文字ObjArr.length; i++) {
            let obj = 日活跃奖励文字ObjArr[i];
            // 包含日活跃数值
            if (活跃日奖励arr.includes(obj.text)) {
                // 点击奖励
                utilsObj.randomClick(Number(obj.x), Number(obj.y) - 100, 1, false)

                sleep(600)

                utilsObj.executeServiceOperate("任务页", "识字点击返回主界面", "regionalClickText2", () => {})

                sleep(500)
                日活跃奖励坐标 = utilsObj.executeServiceOperate("任务页", "日活跃奖励区域", "regionalFindMultipleColor2", () => {})

                if (日活跃奖励坐标 && 日活跃奖励坐标.x === -1) {
                    break;
                }
            }
        }
    }


    let taskTextMap = {
        "登录": "登陆",
        "分享": "分享|分亨",
        "金币": "赠送|次金币",
        "招募": "招募",
        "宝箱": "次宝箱",
        "竞技场": "竞技场|战斗",
        "黑市": "黑市|物品",
        "盐罐": "任意|盐罐"
    }

    // 无需参与的任务
    let needJoinTaskMap = {};

    let taskTextKeyArr = Object.keys(taskTextMap) || [];
    // 遍历
    for (let i = 0; i < taskTextKeyArr.length; i++) {
        let textKey = taskTextKeyArr[i];
        if (serviceStorage.get("noJoinTask_" + textKey)) {
            needJoinTaskMap[textKey] = taskTextMap[textKey]
            delete taskTextMap[textKey]
        }
    }

    let taskTextKeyAfterArr = Object.keys(taskTextMap) || [];

    let scriptType = 2;
    /**
     * 方案一  
     * 识别指定区域，根据需要完成的任务关键字文字识别匹配任务项
     * 根据任务项计算区域，识别是否已完成
     * 已完成的跳过，未完成的执行前往点击
     * 遍历完成后没有还存在未完成的任务，滚动一屏
     */
    if (scriptType === 1) {
        // 遍历目标参数
        for (let i = 0; i < taskTextKeyAfterArr.length; i++) {
            let key = taskTextKeyAfterArr[i];
            // 匹配文字内容
            let taskTextContent = taskTextMap[key]

            // 获取目标区域内 匹配文字的坐标
            let taskTextPosition = utilsObj.executeServiceOperate("任务页", "任务列表文字区域", "regionalAnalysisChartPosition2", () => {}, {
                context: taskTextContent,
                openSplit: true
            })
            // 没有找到坐标跳过
            if (!taskTextPosition) {
                continue;
            }
            let 前往exits = false;
            // 重置计算区域 点击前往
            let 任务结果前往position = utilsObj.executeServiceOperate("任务页", "任务列表文字区域", "regionalClickText3", () => {
                前往exits = true;
            }, {
                position: [Number(taskTextPosition.x), Number(taskTextPosition.y), Number(device.width), Number(taskTextPosition.y + 100)],
                context: "前往|前住"
            })
            // 包括前往
            if (前往exits) {
                break;
            }
        }
        /**
         * 方案二
         * 识别指定区域，获取文字识别结果数组对象
         * 找出所有前往的文字坐标
         * 根据坐标重新计算识别区域
         * 识别区域内的文字，不参与的任务跳过，根据关键字标记已完成的任务
         * 需要完成的点击前往
         * 遍历完成后没有还存在未完成的任务，滚动一屏
         */
    } else if (scriptType === 2) {
        // 目标区域文字识别 返回对象数组
        let textObjArr = utilsObj.executeServiceOperate("任务页", "任务列表按钮区域", "regionalAnalysisChart3", () => {}, {
            canvasMsg: "识别按钮区域文字"
        })

        // 获取包含前往的对象数组
        let 前往Arr = textObjArr.filter(item => item.text.indexOf("前往") !== -1) || []

        // 需要跳过的文字数组
        let needContineTextArr = Object.values(needJoinTaskMap) || [];

        for (let i = 0; i < 前往Arr.length; i++) {
            let 前往obj = 前往Arr[i];
            // 重置计算区域 识别区域内文字
            let regionalText = utilsObj.executeServiceOperate("任务页", "任务列表文字区域", "regionalAnalysisChart2", () => {}, {
                position: [0, Number(前往obj.y) - 100, Number(前往obj.x), Number(前往obj.y)],
                canvasMsg: "识别文字区域内容"
            })
            // 默认为需要点击前往
            let needClick = true;
            needContineTextArr.forEach(item => {
                // 目标文字数组
                let targteContentArr = item.split("|") || []
                targteContentArr.forEach(item2 => {
                    if (regionalText.indexOf(item2) !== -1) {
                        needClick = false;
                    }
                })
            })
            // 执行点击前往操作
            if (needClick) {
                utilsObj.randomClick(前往obj.x, 前往obj.y, 1, false);
                sleep(1000);
                // 执行点击前往 然后跳出循环
                break;
            }
        }
    }
    sleep(1000)
    // 检测还在任务页面 则进行滚动
    let titleText = utilsObj.executeServiceOperate("任务页", "任务标题栏区域", "regionalAnalysisChart2", () => {}, {
        canvasMsg: "识别任务标题栏"
    })
    if (titleText.indexOf("任务") !== -1) {
        let position1 = utilsObj.convertXY(547, 1762);
        let position2 = utilsObj.convertXY(566, 893);
        // 上滑
        swipe(position1.x, position1.y, position2.x, position2.y, 500);


        sleep(1000)
        // 检测是否包含前往
        let regionalText = utilsObj.executeServiceOperate("任务页", "任务列表按钮区域", "regionalAnalysisChart2", () => {}, {
            canvasMsg: "识别按钮区域文字"
        })

        // 如果不包含前往 则下滑
        if (regionalText.indexOf("前往") === -1) {
            let position1 = utilsObj.convertXY(523, 1109);
            let position2 = utilsObj.convertXY(547, 1925);
            // 下滑
            swipe(position1.x, position1.y, position2.x, position2.y, 500);
            sleep(1000)
            // 检测是否包含前往
            let regionalText = utilsObj.executeServiceOperate("任务页", "任务列表按钮区域", "regionalAnalysisChart2", () => {}, {
                canvasMsg: "识别按钮区域文字"
            })
            // 如何还是不包含 则关闭任务
            if (regionalText.indexOf("前往") === -1) {
                // 点击关闭
                utilsObj.randomClick(530, 356, 1, true)
                sleep(500);
                // 点击关闭
                utilsObj.randomClick(530, 356, 1, true)
            }
        }
    }
}


function operate_好友页() {
    utilsObj.executeServiceOperate("好友页", "识字点击一键领取", "regionalClickText2", () => {})
    utilsObj.executeServiceOperate("好友页", "点击返回主界面", "regionalClickText3", () => {})
    let 识字结果 = utilsObj.executeServiceOperate("好友页", "识字一键领取不可点击", "regionalAnalysisChartPosition2", () => {})
    if (!识字结果) {
        utilsObj.executeServiceOperate("好友页", "找图点击关闭", "regionalClickImg2", () => {})
    }
}

function operate_咸将招募页() {
    // 目标区域文字识别 返回对象数组
    let 免费招募text = utilsObj.executeServiceOperate("咸将招募页", "免费招募区域", "regionalAnalysisChart2", () => {}, {
        canvasMsg: "免费招募"
    })

    // TOOD 该业务操作还需要优化

    // 点击招募一次
    utilsObj.executeServiceOperate("咸将招募页", "招募一次区域", "regionalClickText2", () => {}, {
        context: '一次',
        canvasMsg: "点击招募一次"
    })
    sleep(4000)

    // 点击任意区域返回
    utilsObj.executeServiceOperate("咸将招募页", "点击任意区域返回", "regionalClickText2", () => {}, {
        canvasMsg: "点击任意区域返回"
    })
    sleep(2500)
    // 点击任意区域返回
    utilsObj.executeServiceOperate("咸将招募页", "点击任意区域返回", "regionalClickText2", () => {}, {
        canvasMsg: "点击任意区域返回"
    })
    sleep(2500)
    // 随机点开空白关闭
    utilsObj.randomClick(531, 2153, 1, true);
}


function operate_弹层页面() {
    sleep(2000)
    utilsObj.executeServiceOperate("弹层页面", "点击空白区域关闭", "regionalClickText2", () => {}, {
        canvasMsg: "点击空白区域关闭"
    })
}



function operate_今日奖励() {
    /**
     * 关闭窗口
     * 多点找色关闭图标
     * 区域坐标：1355,51,1585,244
     */
    let 点击关闭按钮 = utilsObj.getServiceOperateParam('今日奖励', '关闭按钮_多点颜色点击');
    // 获取到了业务参数
    if (点击关闭按钮) {
        // 截全屏
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            colorThreshold,
            colorOther,
            imgThreshold,
            isOpenGray,
            isOpenThreshold
        } = 点击关闭按钮
        // 多点颜色点击
        utilsObj.regionalClickColor2(img, position[0], position[1], position[2], position[3], threshold, maxVal, colorThreshold, colorOther, imgThreshold, isOpenGray, isOpenThreshold, () => {});
        // 回收图片
        utilsObj.recycleNull(img);
    }
}


function operate_主页() {
    /**
     * 1、找就绪区域文字识别就绪
     * 2、找体力标志  区域找图或者区域特征匹配
     * 3、找到体力标志换算坐标 文字识别体力值
     */
    sleep(500)
    let 就绪识字点击 = utilsObj.getServiceOperateParam('主页', '水晶就绪_识字点击');
    if (就绪识字点击) {
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            context,
            isOpenGray,
            isOpenThreshold
        } = 就绪识字点击
        // 就绪文字的坐标并点击
        utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {});
        utilsObj.recycleNull(img);
    }
    sleep(500)
    let 找体力标志 = utilsObj.getServiceOperateParam('主页', '体力标志_找图或特征');
    if (找体力标志) {
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            pathName,
            imgThreshold,
            bigScale,
            smallScale,
            featuresThreshold,
            isOpenGray,
            isOpenThreshold,
            canvasMsg
        } = 找体力标志
        // 读取特征
        let targetImg = images.read(pathName);
        // 查找体力结果
        let 体力result = utilsObj.regionalFindImgOrFeatures(img, targetImg, position[0], position[1], position[2], position[3], threshold, maxVal, imgThreshold, bigScale, smallScale, featuresThreshold, isOpenGray, isOpenThreshold, canvasMsg);
        utilsObj.recycleNull(img);
        utilsObj.recycleNull(targetImg);
        // 已找到体力标志
        if (体力result && 体力result.x !== -1) {
            // 区域识别文字 体力值  x,y,x+230,y+60

            let img = captureScreen();
            let 体力文字 = utilsObj.regionalAnalysisChart2(img, 体力result.x, 体力result.y, 体力result.x + 230, 体力result + 60, 60, 255, false, false, "体力区域");
            utilsObj.recycleNull(img);
            // 体力结果数组
            let 体力Arr = 体力文字.split("/") || [0, 0]
            // 体力大于40 
            if (体力Arr[0] >= 40) {
                //  进入326 TODO
            }
        }
    }
}

function operate_水晶潭() {
    /**
     * 1、点击开启N个水晶
     * 2、打开多个
     * 3、点击返回水晶密室
     */
    sleep(1000)
    let 开启N个水晶识字点击 = utilsObj.getServiceOperateParam('水晶潭', '开启N个水晶_识字点击');
    if (开启N个水晶识字点击) {
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            context,
            isOpenGray,
            isOpenThreshold
        } = 开启N个水晶识字点击
        // 开启水晶文字的坐标并点击
        utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {
            // 点击空白处加速动画
            utilsObj.randomClick(1783, 501, 1, true);

        });
        utilsObj.recycleNull(img);
    }
    sleep(1000)
    let 打开N个识字点击 = utilsObj.getServiceOperateParam('水晶潭', '打开N个_识字点击');
    if (打开N个识字点击) {
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            context,
            isOpenGray,
            isOpenThreshold
        } = 打开N个识字点击
        // 打开N个文字的坐标并点击
        utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {});
        utilsObj.recycleNull(img);
    }
    sleep(1000)
    let 返回水晶密室识字点击 = utilsObj.getServiceOperateParam('水晶潭', '返回水晶密室_识字点击');
    if (返回水晶密室识字点击) {
        sleep(200);
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            context,
            isOpenGray,
            isOpenThreshold
        } = 返回水晶密室识字点击
        // 开启水晶文字的坐标并点击
        utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {});
        utilsObj.recycleNull(img);
    }
}

function operate_水晶列表() {
    /**
     * 1、切换到水晶tab
     * 2、检测是否有水晶可以开启
     * 3、开启水晶
     * 4、返回主页
     */
    sleep(500)
    let 水晶tab识字点击 = utilsObj.getServiceOperateParam('水晶列表', '水晶tab_识字点击');
    if (水晶tab识字点击) {
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            context,
            isOpenGray,
            isOpenThreshold
        } = 水晶tab识字点击
        // 水晶文字的坐标并点击
        utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {});
        utilsObj.recycleNull(img);
    }
    sleep(500)
    // 滑动次数
    let swipeCount = 0;
    // 已找到开启标志
    let findFlag = false;
    let 开启识字点击 = utilsObj.getServiceOperateParam('水晶列表', '开启_识字点击');
    // 未找到开启
    while (!findFlag) {
        sleep(200)
        if (开启识字点击) {
            let img = captureScreen();
            // 解构参数
            let {
                position,
                threshold,
                maxVal,
                context,
                isOpenGray,
                isOpenThreshold
            } = 开启识字点击
            // 开启文字的坐标并点击
            utilsObj.regionalClickText2(img, position[0], position[1], position[2], position[3], threshold, maxVal, context, isOpenGray, isOpenThreshold, () => {
                findFlag = true;
            });
            utilsObj.recycleNull(img);
        }
        sleep(500)
        if (findFlag) {
            break;
        }
        // 累计次数
        swipeCount += 1;
        // 滑动 1377,863  =》 1353,388
        let bottomPoint = utilsObj.convertXY(424, 902);
        let topPoint = utilsObj.convertXY(433, 360);
        // 从下往上滑动
        swipe(bottomPoint.x, bottomPoint.y, topPoint.x, topPoint.y, 600)
        // 超过次数停止寻找
        if (swipeCount > 10) {
            // 返回主页
            let 点击返回图片或特征 = utilsObj.getServiceOperateParam('水晶列表', '返回_点击图片或特征');
            // 获取到了业务参数
            if (点击返回图片或特征) {
                // 截全屏
                let img = captureScreen();
                // 解构参数
                let {
                    position,
                    threshold,
                    maxVal,
                    pathName,
                    imgThreshold,
                    bigScale,
                    smallScale,
                    featuresThreshold,
                    isOpenGray,
                    isOpenThreshold,
                    canvasMsg
                } = 点击返回图片或特征
                // 调用区域点击图片
                utilsObj.regionalClickImgOrFeatures(img, position[0], position[1], position[2], position[3], threshold, maxVal, imgThreshold, pathName, bigScale, smallScale, featuresThreshold, isOpenGray, isOpenThreshold, () => {});
                // 回收图片
                utilsObj.recycleNull(img);
            }
            break;
        }
    }
}




function operate_菜单栏() {
    /**
     * 1、找菜单栏图标  区域找图
     * 2、点击菜单栏图标  根据坐标点击/区域找图点击
     * 调试了好一段时间才发现有两个问题
     * 1、这里sleep延迟必须要，否则截图还是上一个，取不到
     * 2、300,0,500,100 坐标范围还是要大一点
     */
    sleep(2000)
    let 点击菜单栏图片或特征 = utilsObj.getServiceOperateParam('菜单栏', '菜单栏_点击图片或特征');
    // 获取到了业务参数
    if (点击菜单栏图片或特征) {
        // 截全屏
        let img = captureScreen();
        // 解构参数
        let {
            position,
            threshold,
            maxVal,
            pathName,
            imgThreshold,
            bigScale,
            smallScale,
            featuresThreshold,
            isOpenGray,
            isOpenThreshold,
            canvasMsg
        } = 点击菜单栏图片或特征
        // 调用区域点击图片
        utilsObj.regionalClickImgOrFeatures(img, position[0], position[1], position[2], position[3], threshold, maxVal, imgThreshold, pathName, bigScale, smallScale, featuresThreshold, isOpenGray, isOpenThreshold, () => {});
        // 回收图片
        utilsObj.recycleNull(img);
    }
}


// 更新状态栏内容
events.broadcast.emit("updateMessageFloaty", 'messageText', '状态栏：准备中');
sleep(2500)
// 清空文件夹
files.removeDir("/sdcard/autoJsAfterImg/")
// 开启线程 监测当前页面
threads.start(() => {
    let tempCurPage = ""
    while (true) {
        sleep(500)
        try {
            // 判断当前所在页面
            tempCurPage = getCurPage()
        } catch (error) {
            console.info("尝试重新请求截图权限")
            if (commonStorage.get('debugModel')) {
                console.info("获取页面方法错误：", error)
            }
            images.stopScreenCapture()
            images.requestScreenCapture({
                orientation: utilsObj.getOrientation()
            })
        }
        if (tempCurPage) {
            // 页面判定相同
            if (curPage === tempCurPage) {
                // 计数
                samePageCount += 1;
            } else {
                // 重置计数
                samePageCount = 0
            }
            // 重新賦值当前页面
            curPage = tempCurPage
            // 更新状态栏内容
            events.broadcast.emit("updateMessageFloaty", 'messageText', '当前页：' + curPage);
            try {
                // 对应页面的操作处理
                operateHandle(tempCurPage)
            } catch (error) {
                if (commonStorage.get('debugModel')) {
                    console.error("操作处理方法错误：", error)
                }
            }
            // 重置未匹配次数
            notMatchingCount = 0

        } else {
            // 未匹配次数+1
            notMatchingCount += 1
        }
        $debug.gc()
        utilsObj.clearMemory()

        if (commonStorage.get('debugModel')) {
            let memoryInfo = utilsObj.getMemoryInfo()
            console.info(memoryInfo)
        }

        let 连续同一页面次数 = commonStorage.get("连续同一页面次数") || 15
        let 连续无匹配页面次数 = commonStorage.get("连续无匹配页面次数") || 15

        if (notMatchingCount > 连续无匹配页面次数 * 0.75) {
            console.warn("尝试重开截图权限")
            try {
                images.stopScreenCapture()
                images.requestScreenCapture({
                    orientation: utilsObj.getOrientation()
                })
            } catch (error) {
                if (commonStorage.get('debugModel')) {
                    console.error("主程序请求截图错误", error)
                }
            }
            sleep(1000)
        }

        if (notMatchingCount > 连续无匹配页面次数) {
            console.warn("未匹配次数已达" + 连续无匹配页面次数 + "次,尝试重启游戏")
            notMatchingCount = 0;
            utilsObj.exitApp(appName, () => {
                // 启动
                launchApp(appName);
            })
        }

        if (samePageCount > 连续同一页面次数) {
            console.warn("连续同一页面次数已达" + 连续同一页面次数 + "次,尝试重启游戏")
            samePageCount = 0;
            utilsObj.exitApp(appName, () => {
                // 启动
                launchApp(appName);
            })
        }

    }
})
//保持脚本运行
setInterval(() => {
    // toastLog("脚本保持运行")
}, 5000);